package pvn.com.controls.marketwatch;

import pvn.com.ParamsStorage;
import pvn.com.SymbolInfo;
import pvn.com.TickData;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.XYRect;
import net.rim.device.api.ui.decor.Background;

/**
 * Class thực hiện việc vẽ từng dòng trong màn hình Rate.<br>
 * 
 * @author ngo.dinh.ngoc
 * 
 */
public class MarketWatchCell {

    /** Hằng số để kiểm tra vẽ header. */
    public static int TYPE_HEADER_CELL = 1;

    /** Hằng số kiểm tra vẽ cặp tiền tệ. */
    public static int TYPE_SYMBOL_CELL = 2;

    /** */
    // TODO : Not used
    private boolean firstInGroup = false;

    /** */
    // TODO : Not used
    private boolean lastInGroup = false;

    /** */
    private int group_index = 0;

    /** */
    private int symbol_index = 0;

    /** Thuộc tính kiểm tra kiểu header or symbol. */
    public int type;

    /** Tên symbol. */
    public String id;

    /** */
    private Background bgNormal = null;

    /** */
    private Background bgSelected = null;

    /** Thuộc tính set background cho header. */
    private Background bgHeader = null;

    /** Thuộc tính ảnh khi rate tăng. */
    private Bitmap imgUp = Bitmap.getBitmapResource("images/grid/up_blue.png");

    /** Thuộc tính ảnh khi rate giảm. */
    private Bitmap imgDown = Bitmap.getBitmapResource("images/grid/down_red.png");

    /**
     * Hàm khởi tạo thực hiện lại việc setting các thuộc tính.<br>
     * 
     * @param _type
     *            giá trị: 1|2
     * @param _id
     */
    public MarketWatchCell(int _type, String _id) {
        this.type = _type;
        this.id = _id;
        this.firstInGroup = false;
    }

    /**
     * Hàm thực hiện set background cho 1 dòng.<br>
     * 
     * @param _bgNormal
     *            : Đối tượng backgroud thông thường.
     * @param _bgSelected
     *            : Đối tượng background khi select.
     * @param _bgHeader
     *            : Đối tượng background của header.
     */
    public void setBackgrounds(Background _bgNormal, Background _bgSelected, Background _bgHeader) {
        this.bgNormal = _bgNormal;
        this.bgSelected = _bgSelected;
        this.bgHeader = _bgHeader;
    }

    /**
     * Hàm thực hiện vẽ các giá trị trong 1 dòng.<br>
     * 
     * @param graphics
     *            : Đối tượng graphic của RIM.
     * @param index
     * @param y
     *            : Tọa độ đỉnh của Rect
     * @param w
     *            : Chiều rộng của rect
     * @param isSelected
     *            : True|False : Row được chọn or không được chọn
     * @param rowHeight
     *            : Chiều cao của row.
     * 
     */
    public void drawListRow(Graphics graphics, int index, int y, int w, boolean isSelected,
            int rowHeight) {

        // 0. Xóa dòng hiện tại.
        graphics.clear();

        // 1. Thiết lập màu chữ đen cho dòng hiện tại.
        graphics.setColor(0);

        // 2.Thực hiện việc vẽ row.
        // 2.1. Nếu giá trị type = 1.<Kiểu header>
        if (type == TYPE_HEADER_CELL) {

            // Kích thước font chữ.
            int fontHeight = 19;

            // Vẽ hình chữ nhật bao quanh header.
            bgHeader.draw(graphics, new XYRect(0, y, w, rowHeight));

            // Thiết lập màu trắng cho row.
            graphics.setColor(0xFFFFFF);

            // Thiết lập font chữ cho row.
            graphics.setFont(graphics.getFont().derive(1, fontHeight));

            // Thiết lập giá trị text là : thuộc tính Id <>
            // TODO : id ?
            graphics.drawText(id, 15, y + (rowHeight - fontHeight) / 2, 0, w);
        }

        // 2.2. Nếu giá trị type khác 1.
        else {
            // 2.2.1. Nếu row hiện tại được chọn
            if (isSelected) {
                graphics.setColor(0xE3E3E3);
            }

            // 2.2.2. Nếu row không được họn
            else {
                graphics.setColor(0xFFFFFF);
            }
            // 2.2.3. Tạo rect trên row. Khi row được chọn.
            graphics.fillRect(0, y, w, rowHeight);

            // 2.2.4. Thông tin về symbol
            SymbolInfo si = (SymbolInfo) ParamsStorage.Symbols.get(this.id);

            // 2.2.5. Thông tin về giá cho symbol.
            // TODO Sửa lại thông tin.
            TickData td = (TickData) ParamsStorage.Prices.get(this.id);

            // 2.3. Vị trí vẽ image khi giá tăng hoặc giảm.
            // TODO Sửa lại thông tin.
            int pos = (20 - this.imgUp.getWidth()) / 2;

            // 2.3.1. Ảnh up or down.
            Bitmap arrow = null;
            int priceColor = 0;

            // 2.3.2. Khi giá tăng : direction =1
            if ((td == null) || (td.direction == 1)) {
                arrow = this.imgUp;
                priceColor = 0x1861D6;
            }

            // 2.3.3. Khi giá giảm.
            else {
                arrow = this.imgDown;
                priceColor = 0xEE0000;
            }

            // 2.3.4. Vẽ image up or down.
            graphics.drawBitmap(pos, y + (rowHeight - this.imgUp.getHeight()) / 2,
                    this.imgUp.getWidth(), this.imgUp.getHeight(), arrow, 0, 0);

            // 2.4. Thiết lập vị trí vẽ image tăng hoặc giảm là 20.
            pos = 20;

            // 2.4.1. Thiết lập font chữ là 18px
            graphics.setFont(graphics.getFont().derive(1, 18));

            // 2.4.2. Thiết lập màu cho symbol.
            int symbolColor = 0x000000;

            if ((si == null) || (si.TradeMode == 0)) {
                symbolColor = 0x808080;
            } else if (si.TradeMode == 1) {
                symbolColor = 0xA9A9A9;
            } else if (si.TradeMode == 2) {
                symbolColor = 0x000000;
            }

            // 2.4.3. Vẽ symbol name lên màn hình.
            graphics.setColor(symbolColor);
            graphics.drawText(this.id, pos, y + rowHeight / 2, 32, w);

            // 2.5.Vẽ giá BID và giá ASK lên màn hình.
            String s_bid = "";
            String s_ask = "";

            // 2.5.1. Khi tồn tại giá bid và ask.
            if (td != null) {
                s_bid = td.Bid;
                s_ask = td.Ask;
            }

            // 2.5.3. TODO -> Problem ???
            if (MarketWatch.symbolNameWidth == 0) {
                MarketWatch.symbolNameWidth = graphics.getFont().getAdvance("WWWXXX");
            }

            // 2.5.4. Cộng thêm chiều rộng của symbol name cho biến chứa pos.
            pos += MarketWatch.symbolNameWidth;

            // 2.5.5. Chiều rộng của để thực hiện vẽ Price
            int pricesWidth = w - pos;

            // 2.5.6. Vẽ đường bao quanh ô vẽ giá trị bid & ask.
            graphics.setColor(0xC1C1C1);
            graphics.drawLine(pos, y, pos, y + rowHeight - 1);
            graphics.drawLine(pos + pricesWidth / 2, y, pos + pricesWidth / 2, y + rowHeight - 1);
            graphics.drawLine(0, y + rowHeight - 1, w, y + rowHeight - 1);

            // 2.5.7. Vẽ giá trị bid & ask.
            int fontHeight = 12;
            graphics.setFont(graphics.getFont().derive(1, 19));
            graphics.setColor(priceColor);
            fontHeight = graphics.getFont().getHeight();
            graphics.drawText(s_bid, pos, y + 2, 5, pricesWidth / 2 - 2);
            graphics.drawText(s_ask, pos, y + rowHeight - 2 - fontHeight, 5, pricesWidth / 2 - 2);

            // 2.5.8. Vẽ lablel Bid & Ask.
            graphics.setFont(graphics.getFont().derive(0, 12));
            graphics.setColor(0x8C8C8C);
            int fontHeightSmall = graphics.getFont().getHeight();
            graphics.drawText(MarketWatch.cellBid, pos + 2, y + 2 + (fontHeight - fontHeightSmall)
                    - 2, 0, pricesWidth / 2);
            graphics.drawText(MarketWatch.cellAsk, pos + 2,
                    y + rowHeight - 2 - fontHeightSmall - 2, 0, pricesWidth / 2);
        }
    }
}
